package com.probiz.estore.content.service;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import com.probiz.estore.common.model.catalog.ContentCategory;
import com.probiz.estore.common.model.content.Content;
import com.probiz.estore.content.model.ContentFullyModel;
import com.probiz.estore.content.model.ContentSearchCriteria;
import com.probiz.estore.core.search.SearchCriteria;
import com.probiz.estore.core.service.GenericManager;

/**
 * Manager interface for Content, responsible for business processing, and communicate between web and persistence layer.
 */
public interface ContentManager extends GenericManager<Content> {
    /* =========================start:自定义方法=========================================== */
    /**
     * 根据目录id获得直接所属文章个数
     *
     * @param categoryId 目录id
     * @return 文章总数
     */
    public Integer countContentByCategoryId(Integer categoryId);

    /**
     * 根据目录获得所属文章个数,包括子孙目录的文章
     *
     * @param contentCategory 内容目录
     * @return 文章总数
     */
    public Integer countContentIncludeAllByCategory(ContentCategory contentCategory);

    /**
     * 根据目录获得激活所属文章个数,包括子孙目录的文章
     *
     * @param contentCategory 内容目录
     * @return 文章总数
     */
    public Integer countActiveContentIncludeAllByCategory(ContentCategory contentCategory);

    /**
     * 完全保存函数
     *
     */
    public Map<String, Object> saveFully(ContentFullyModel model);

    /**
     * 完全删除函数
     *
     * @param content 文章
     */
    public void deleteFully(Content content);

    /**
     * 更新有效期
     *
     * @param content 文章
     */
    public void updateExpired(Content content);

    /**
     * 搜索文章
     *
     * @param contentSearchCriteria 自定义搜索条件
     * @param searchCriteria        分页搜索条件
     * @return 文章列表结果
     */
    public List<Content> searchByCriteria(ContentSearchCriteria contentSearchCriteria, SearchCriteria searchCriteria);

    /**
     * 搜索文章，从GenericController借鉴过来。防止翻页过钱
     *
     * @param contentSearchCriteria 自定义搜索条件
     * @param searchCriteria        自定义搜索条件
     * @return 文章列表结果
     */
    public List<Content> searchByCriteriaForController(ContentSearchCriteria contentSearchCriteria, SearchCriteria searchCriteria);
    
    /**
     * 获取文章列表
     * @param contentSearchCriteria 自定义搜索条件
     * @param firstResult 开始
     * @param maxResults 最多个数
     * @return 文章列表
     */
    public List<Content> getContentList(final ContentSearchCriteria contentSearchCriteria,final int firstResult, final int maxResults);


    /**
     * 获得指定数量和特定目录下(包括子目录)推荐的文章(sortOrder较小)
     *
     * @param categoryId 指定目录id
     * @param size       指定数量
     * @return 推荐文章
     */
    public List<Content> getRecommendedContents(final Integer categoryId, final int size);

    /**
     * 获得指定数量和特定目录下(包括子目录)最新的文章(publishTime较晚)
     *
     * @param categoryId 指定目录id
     * @param size       指定数量
     * @return 推荐文章
     */
    public List<Content> getNewestContents(final Integer categoryId, final int size);

    /**
     * 获得指定数量和特定文章相关的文章(关键词相关)
     *
     * @param contentId 指定文章id
     * @param size      指定数量
     * @return 推荐文章
     */
    public List<Content> getRelatedContents(final Integer contentId, final int size);
    
    /**
   	 * 根据fieldName改变统计对应field的值。count为改变数量，可以为正，也可以为负。
   	 */
   	public void updateStatField(final Integer contentStatId,final String fieldName,final Integer count);
    
  
    /* =========================end:自定义方法=========================================== */

    /* =========================start:前台自定义方法=========================================== */

    /**
     * 根据前台uri获得文章id
     *
     * @param uri 前台uri
     * @return 文章id
     */
    public Integer getContentIdByUri(String uri);

    /**
     * 根据产品获得前台uri
     *
     * @param content 内容
     * @return uri
     */
    public String getUriByContent(Content content);
    /* =========================start:后台自定义方法=========================================== */
}
